C++ 编译流程
编译流程

- 预处理环节完成 #include 等宏和常量的替换
- 编译过程,生成的机器指令放一堆 .obj 文件中
- 链接过程将编译产生的 obj 文件和引用的库链接到一起,生成可执行文件或动态链接库
预处理指令 #pragma once
告诉预处理器这个文件只会被处理一次,避免多次引用同一文件后存在内容
应用程序的内存布局
- 内核空间:用于存储操作系统和驱动程序为进程提供的临时机器指令和中间变量。
- 映射段:用于装载或映射动态链接库,也常用于将文件内容映射到内存中。
- 代码段:用于存放应用程序的机器指令,为了防止指令被其他程序修改,代码段是只读的。
- 数据段:用于存储全局变量、静态变量(static)和常量数据(const)。
- 堆:用于存储应用程序运行过程中申请的内存空间,比如使用 malloc 方法或 new 关键字申请的内存。
- 栈:用于存储函数的局部变量、参数、返回值及调用者的上下文信息。

2023-11-07.md 栈与栈帧

- 在
栈空间中分配内存的变量不需要程序员手动销毁,栈帧销毁时栈帧上的变量会被自动销毁。 - 栈的总内存大小是固定的,而且非常小,递归操作容易爆栈
- 操作栈上的内存效率很高
堆
- 使用 new 操作符返回堆空间地址(指针)
- 需要开发者手动释放,使用 delete 关键字
- 堆内存容量大,适合放大对象或数组